package DesignPrinciple.OpenClose.LSP;

public class RectangleTest {
    /*
    里氏代换原则：任何基类可以出现的地方，子类一定可以出现。
    通俗理解：子类可以扩展父类的功能，但不能改变父类原有的功能。换包话说，子类继承父类时，除添加新的方法完成新增功能外，尽量不要重写父类的方法。
    如果通过重写父类的方法来完成新的功能，这样写起来虽然简单，但是整个继承体系的可复用性会比较差，特别是运用多态比较频繁时，程序运行出錯的概率会非常大。
     */
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20);
        rectangle.setWidth(15);
        printLengthAndWidth(rectangle);
        System.out.println("-----------------------------");
        resize(rectangle);
        printLengthAndWidth(rectangle);
        System.out.println("=============================");
        Square square = new Square();
        square.setLength(20);
        printLengthAndWidth(square);
        System.out.println("-----------------------------");
        square.setWidth(15);
        printLengthAndWidth(square);
        /*
        在resize方法中，Rectangle类型的参数是不能被square类型的参数所代替，如果进行了替换就得不到预期结果。
        因此，Square类和Rectangle类之间的继承关系违反了里氏代换原则，它们之间的继承关系不成立，正方形不是长方形。
         */
//        resize(square);
    }

    public static void resize(Rectangle rectangle) {
//        宽比长小，扩宽
        while (rectangle.getWidth() <= rectangle.getLength()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    public static void printLengthAndWidth(Rectangle rectangle) {
        System.out.println("Width: " + rectangle.getWidth() + "\tHeight: " + rectangle.getLength());
    }
}
